#include <stdio.h>

int main()
{

    union quantity
    {
        short count;
        float weight;
        float volume;
    };

    // 写法一
    union quantity q1;
    q1.count = 4;

    // 写法二
    union quantity q2 = {.count = 4};

    // 写法三
    union quantity q3 = {4};

    printf("count is %i\n", q1.count);   // count is 4
    printf("weight is %f\n", q1.weight); // 未定义行为

    q1.weight = 0.5;
    printf("weight is %f\n", q1.weight); // weight is 0.5

    union quantity *ptr;
    ptr = &q2;
    printf("%d\n", ptr->count); // 4

    // Union 结构指针与它的属性有关，当前正在按照哪个属性解读数据，它的指针就是对应的数据类型
    union foo
    {
        int a;
        float b;
    } x;

    int *foo_int_p = (int *)&x;
    float *foo_float_p = (float *)&x;

    x.a = 12;
    printf("%d\n", x.a);        // 12
    printf("%d\n", *foo_int_p); // 12

    x.b = 3.141592;
    printf("%f\n", x.b);          // 3.141592
    printf("%f\n", *foo_float_p); // 3.141592

    // Union 结构的好处，主要是节省空间。它将一段内存空间，重用于不同类型的数据。定义了三个属性，但同一时间只用到一个，使用 Union 结构就可以节省另外两个属性的空间。Union 结构占用的内存长度，等于它内部最长属性的长度。
    return 0;
}